package bz.ziro.kanbe.bean;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.slim3.datastore.Datastore;

import com.google.appengine.repackaged.com.google.common.base.StringUtil;

import bz.ziro.kanbe.logic.HtmlLogic;
import bz.ziro.kanbe.meta.SiteTextMeta;
import bz.ziro.kanbe.model.SiteText;

/**
 * テキストデータ
 * @author Administrator
 */
public class TextData {
	
    @SuppressWarnings("unused")
    private static final Logger logger = Logger.getLogger(HtmlLogic.class.getName());
    /**
     * 文字列データ
     */
    private static Map<String,String> gblTextMap = null;

    /**
     * アクセス用メタデータ
     */
    private static final SiteTextMeta textMeta = new SiteTextMeta();

    /**
     * テキストデータの取得
     * @param aKey
     * @return
     */
    public String get(String aKey) {
    	if ( gblTextMap == null ) {
    		refreshTextMap();
    	}
    	return gblTextMap.get(aKey);
    }
   
    /**
     * 自動変換
     * @param aValue
     * @return
     */
    public String auto(String aValue) {
    	if ( StringUtil.isEmpty(aValue) ) return "";
    	String rtn = autoTag(aValue);
    	rtn = autoBr(rtn);
    	rtn = autoLink(rtn);
    	return rtn;
    }

    /**
     * 自動改行
     * @param aValue
     * @return
     */
    public String autoBr(String aValue) {
    	if ( StringUtil.isEmpty(aValue) ) return "";
    	String rtn = aValue.replaceAll("\r\n", "\n").replaceAll("[\r|\n]","\n");
    	rtn = rtn.replaceAll("\n", "<br>\n");
		return rtn;
	}
    /**
     * 自動リンク
     * @param aValue
     * @return
     */
    public String autoLink(String aValue) {
    	if ( StringUtil.isEmpty(aValue) ) return "";
        // コンパイルされた正規表現
        Pattern objPtn = Pattern.compile("(http://|https://){1}[\\w\\.\\-/:\\#\\?\\=\\&\\;\\%\\~\\+]+", Pattern.CASE_INSENSITIVE);
        // マッチング結果をMatcherオブジェクトに代入
        Matcher objMch = objPtn.matcher(aValue);
        // 置き換え処理（[$0]はマッチングした文字列）
        return objMch.replaceAll("<a href='$0' target=\"_blank\">$0</a>");
	}
    
    /**
     * 自動タグ
     * @param aValue
     * @return
     */
    public String autoTag(String aValue) {
    	if ( StringUtil.isEmpty(aValue) ) return "";
    	String rtn = aValue.replaceAll("<", "&lt;");
    	rtn = rtn.replaceAll(">", "&gt;");
		return rtn;
	}
    
    /**
     * 文字列長さ制御
     * @param aText
     * @param aCount
     * @return
     */
    public String limit(String aText,int aCount) {
    	return limit(aText,aCount,true);
    }
    /**
     * 文字列長さ制御
     * @param aText
     * @param aCount
     * @return
     */
    public String limit(String aText,int aCount,boolean aFlag) {
    	
    	if ( StringUtil.isEmpty(aText) ) return "";
    	//小さかった場合
    	if ( aText.length() <= aCount ) {
    		//そのまま返す
    		return aText;
    	}
    	//取得する場合
    	if ( aFlag ) {
    		return aText.substring(0,aCount) + "...";
    	} else {
    		return aText.substring(0,aCount);
    	}
    }

	/**
     * テキスト再検索
     */
    public static void refreshTextMap() {
        gblTextMap = new HashMap<String,String>();
        List<SiteText> textList = Datastore.query(textMeta).asList();
        //テキスト数回繰り返す
        for ( SiteText text : textList ) {
            gblTextMap.put(String.valueOf(text.getKey().getId()), text.getText());
        }
    }
}
